Computers are used all over the world to perform a wide variety of tasks. Computers perform these tasks by processing software code which contains commands that are interpreted and executed by the computer. Software code is typically written by a developer using one or more scripting or programming languages. Because most software programs are quite complex and involve the interaction of multiple functions, variables and processes, application programming interfaces and shared libraries have been developed to allow a developer to incorporate common functionality into the program without having to write the code for it. This also helps to cut down on the size of a software program which, in turn, increases program processing efficiency. Thus, shared libraries are commonly used in many of today's software applications.
Many times, in a computer system with a variety of installed applications, a shared library or assemblies cache (i.e. a store of compiled, executable code) will be secured to allow the various programs read and execute access, but deny them write access (typically only a system administrator will have write access to the assemblies cache). This prevents programs from overwriting assemblies in the cache. In such cases, the assemblies cache is said to be trusted. Thus, virtually any software program installed on the computer system can read and execute assemblies from the assemblies as cache without having to verify the integrity or authenticity of each assembly. The assemblies themselves are inherently trusted because the assemblies are located in the trusted assemblies cache. Avoiding authenticity checks in this manner also increases program processing efficiency.
To take advantage of shared assemblies, developers typically include metadata in the software program that points to the trusted assemblies cache. At runtime, an assembly from the cache can be read and/or executed by any function or routine in the program as part of normal program processing. An assembly can be called multiple times during the processing of a software program. In some cases, multiple functions may read and execute (or attempt to execute) an assembly at the same time. Some operating systems have a means for creating instances of assemblies and providing each program its own instance of the assembly. For example, using instances of assemblies, multiple programs may simultaneously access an assembly that writes characters and/or images to a display screen.
Thus, because trusted assemblies caches are convenient and lead to more efficient software program processing, they have become mainstream in modem software development. Assemblies caches, however, are limited as to the locations in which they can be deployed. Currently, the trusted assemblies cache location is predefined in the software program and cannot be modified without changes to the program code of the software program. Furthermore, the trusted assemblies cache is located on the same computer system as the software applications that are accessing the assemblies in the cache.